package com.penta.util;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.penta.services.ModuleOneService;
import com.penta.services.ModuleService;
import com.penta.services.ModuleTwoService;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.xssf.usermodel.XSSFPicture;
import org.apache.poi.xssf.usermodel.XSSFShape;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Excel 转换工具
 */
@Data
@NoArgsConstructor
public class ExcelConverterUtil {

    private String sourceFile;
    private String exportPath;
    private String moduleType;

    /**
     * 构造函数
     *
     * @param sourceFile
     *              源文件路径
     * @param exportPath
     *              输出结果目录
     * @param moduleType
     *              模板类型：1 模板1; 2 模板2.
     */
    public ExcelConverterUtil(String sourceFile,String exportPath,String moduleType) {
        this.sourceFile = sourceFile;
        this.exportPath = exportPath;
        this.moduleType = moduleType;
    }

    /**
     * 开始执行转换
     * @return
     */
    public JsonResult execConverter() {

        /**
         * 实例源文件
         */
        File sourceFile = new File(this.getSourceFile());

        /**
         * 读取源文件，将所有的数据读出
         */
        List<List<Object>> dataList = ExcelHelper.readDataList(sourceFile);
        if(CollectionUtil.isEmpty(dataList)) {
            return JsonResult.Fail("选择的原始文件内容为空！");
        }

        /**
         * 判断选择的模板类型是否与传入的原始文件匹配
         */
        String checkModuleType = checkModuleType(dataList);    // 根据传入的数据，自动判断模板类型
        if("-1".equals(checkModuleType)) {
            return JsonResult.Fail("选择的原始文件，数据的列数不对，无法判断模板类型，请检查原始数据文件！");
        }

        /**
         * 重新赋值模板类型
         */
        moduleType = checkModuleType;

        /**
         * 获取源文件的文件名
         */
        String sourceFileName = sourceFile.getName();
        boolean isXlsx = StrUtil.endWith(sourceFileName,".xlsx");     // 源文件是否以 xlsx 结尾

        /**
         * 获取所有的图片列表
         * 主要是返回图片的字节数组
         */
        List<byte[]> pictureDataList = new ArrayList<>();
        if(isXlsx) {
            pictureDataList = ExcelHelper.getPictureDataList(sourceFile);
        } else {
            pictureDataList = ExcelHelper.getPictureDataListForXls(sourceFile);
        }


        /**
         * 创建并返回生成1
         */
        File output1 = FileUtil.createOutPutFile(sourceFileName,"1",this.exportPath,moduleType);
        ExcelWriter writer1 = ExcelUtil.getWriter(output1);      // 获取输出1的 writer
        /**
         * 创建并返回生成2
         */
        File output2 = FileUtil.createOutPutFile(sourceFileName,"2",this.exportPath,moduleType);
        ExcelWriter writer2 = ExcelUtil.getWriter(output2);      // 获取输出2的 Writer

        if("1".equals(moduleType)) {
            ModuleOneService moduleOneService = new ModuleOneService(writer1,writer2,dataList,pictureDataList);
            moduleOneService.execOutput();
        } else {
            ModuleTwoService moduleTwoService = new ModuleTwoService(writer1,writer2,dataList,pictureDataList);
            moduleTwoService.execOutput();
        }

        writer1.close();
        writer2.close();

        return JsonResult.Success("转换成功");
    }


    /**
     * 自动判断模板的类型
     *      判断依据：
     *          （1）如果 "PENTA ASIA LIMITED" 字符串出现在第21列，序号为20，表示是模板1
     *          （2）如果 "PENTA ASIA LIMITED" 字符串出现在第9列，序号为8，表示是模板2
     *          （3）否则，返回 -1， 表示传入的数据表的格式不对
     * @param dataList
     * @return
     *      返回判断的模板类型
     *          如果：返回的是-1，则表示数据表问题
     */
    private String checkModuleType(List<List<Object>> dataList) {
        String checkModuleType = "-1";

        List<Object> firstData = dataList.get(0);     // 取出第一行数据
        int size = firstData.size();     // 第一行的列数
        if(size < 9) {
            return checkModuleType;
        }

        String companyInfo = "PENTA ASIA LIMITED";

        if(size < 21) {      // 如果小于21列，则表示是模板2，但是还是需要判断第9列的值是否为 "PENTA ASIA LIMITED"
            if(ObjectUtil.isNotEmpty(firstData.get(8)) && companyInfo.equalsIgnoreCase(String.valueOf(firstData.get(8)))) {
                checkModuleType = "2";
            }
        } else {            // 如果大于等于21列时，很有可能是模板1，还需要判断第21列是否为： "PENTA ASIA LIMITED"

            if(ObjectUtil.isNotEmpty(firstData.get(20)) && companyInfo.equalsIgnoreCase(String.valueOf(firstData.get(20)))) {
                checkModuleType = "1";
            }

        }

        return checkModuleType;
    }






}
